package com.mimose.component.chains.invoker;

import com.mimose.component.chains.entity.request.RequestBaseDto;
import com.mimose.component.chains.entity.response.AbsResponse;
import com.mimose.component.chains.entity.response.Response;
import com.mimose.component.chains.entity.response.ResponseBaseDto;

/**
 * @Description 链路处理类<A, T>
 * @Author ccy
 * @Date 2019/10/17 14:11
 */
public abstract class Invoker<A extends RequestBaseDto, T extends AbsResponse> {

    //下一个处理类
    private Invoker next;
    //获取下一个处理类
    public Invoker next0(){
        return this.next;
    }
    //设置下一个处理类
    public final void setNext(Invoker next) {
        if(this.next!=null){
            this.next.setNext(next);
        }else{
            this.next = next;
        }
    }

    /**
     * 获取上个处理器处理后的结果response
     * @param tResponse
     * @param bInstatnce
     * @param <B>
     * @return
     */
    public <B extends ResponseBaseDto> B getLastResponse(Response tResponse, B bInstatnce) {
        return tResponse==null || tResponse.getResponse()==null? bInstatnce: (B) tResponse.getResponse();
    }

    /**
     * 进行处理（需要实现具体处理方法）
     * @param request   继承TRequestBaseDto的具体类，包含具体的请求信息
     * @param response  返回体，若不是第一个处理器，此处会是上一次处理的返回体（泛型 T 为了传值而增加，均为TResponse类）
     * @return
     */
    public abstract T invoke0(A request, T response);
}
